//package com.yf.monitor.service;
//
//import com.yf.monitor.ApiMonitorProperties;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.jdbc.core.JdbcTemplate;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Service;
//
//import javax.annotation.PostConstruct;
//import java.util.ArrayList;
//import java.util.List;
//
///**
// * @ClassName AnomalyDetectionService
// * @Description 异常检测服务
// * @Author Scott.Yin
// * @Date 2025/8/21 19:58
// * @Version 1.0
// **/
//@Service
//@Slf4j
//public class AnomalyDetectionService {
//    private final JdbcTemplate jdbcTemplate;
//    private final ApiMonitorProperties properties;
//    private final List<String> alertRules = new ArrayList<>();
//
//    public AnomalyDetectionService(JdbcTemplate jdbcTemplate,
//                                   ApiMonitorProperties properties) {
//        this.jdbcTemplate = jdbcTemplate;
//        this.properties = properties;
//    }
//
//    @PostConstruct
//    public void init() {
//        // 初始化告警规则
//        alertRules.add("error_rate_rule");
//        alertRules.add("latency_rule");
//        alertRules.add("qps_spike_rule");
//    }
//
//    @Scheduled(fixedRate = 60000) // 每分钟执行一次
//    public void checkAnomalies() {
//        if (!properties.isEnabled()) {
//            return;
//        }
//
//        try {
//            // 获取所有接口最近一分钟的统计
//            String sql = "SELECT " +
//                    "api_tag, " +
//                    "COUNT(*) as total_count, " +
//                    "SUM(IF(success, 0, 1)) as error_count, " +
//                    "AVG(duration) as avg_duration " +
//                    "FROM api_records " +
//                    "WHERE ts >= NOW - 1m " +
//                    "GROUP BY api_tag";
//
//            jdbcTemplate.query(sql, rs -> {
//                String apiName = rs.getString("api_tag");
//                long totalCount = rs.getLong("total_count");
//                long errorCount = rs.getLong("error_count");
//                double avgDuration = rs.getDouble("avg_duration");
//
//                // 错误率异常检测
//                if (totalCount > 10 && errorCount > 0) {
//                    double errorRate = (double) errorCount / totalCount;
//                    if (errorRate > 0.1) { // 错误率超过10%
//                        log.warn("接口 {} 错误率异常: {:.2f}%", apiName, errorRate * 100);
//                        // 这里可以集成告警系统
//                    }
//                }
//
//                // 响应时间异常检测
//                if (totalCount > 5 && avgDuration > 1000) { // 平均响应时间超过1秒
//                    log.warn("接口 {} 平均响应时间异常: {:.2f}ms", apiName, avgDuration);
//                    // 这里可以集成告警系统
//                }
//
//                // QPS突增检测（需要与历史数据对比）
//                if (totalCount > 50) {
//                    detectQpsSpike(apiName, totalCount);
//                }
//            });
//        } catch (Exception e) {
//            log.error("异常检测执行失败", e);
//        }
//    }
//
//    private void detectQpsSpike(String apiName, long currentQps) {
//        try {
//            // 获取历史QPS数据进行比较
//            String sql = String.format(
//                    "SELECT AVG(total_count) as avg_qps, STDDEV(total_count) as stddev_qps " +
//                            "FROM (SELECT COUNT(*) as total_count FROM api_records " +
//                            "WHERE api_tag = '%s' AND ts >= NOW - 1h GROUP BY INTERVAL(1m)) t",
//                    apiName);
//
//            jdbcTemplate.query(sql, rs -> {
//                double avgQps = rs.getDouble("avg_qps");
//                double stddevQps = rs.getDouble("stddev_qps");
//
//                // 使用3-sigma规则检测异常
//                if (currentQps > avgQps + 3 * stddevQps) {
//                    log.warn("接口 {} QPS突增: 当前 {}, 平均 {:.2f}", apiName, currentQps, avgQps);
//                    // 这里可以集成告警系统
//                }
//            });
//        } catch (Exception e) {
//            log.error("QPS突增检测失败", e);
//        }
//    }
//}
